home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 103 < prev    next >
Text File  |  1995-07-05  |  45KB  |  1,199 lines

  1. C.S.M.P. Digest             Wed, 05 Jul 95       Volume 3 : Issue 103
  2.  
  3. Today's Topics:
  4.  
  5.         Explanation of color palettes
  6.         MoveControl for Modeless Dialogs
  7.         Opening Control Panels from within an Application
  8.         QT2.0 & NewMovieFromUserProc help...
  9.         Selecting a DA
  10.         Sound Manager - handling underrun in double-buffered playback ?
  11.         [ANNOUNCE] MacTCP programmer's web page MOVED
  12.  
  13.  
  14.  
  15. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  16. (pottier@clipper.ens.fr).
  17.  
  18. The digest is a collection of article threads from the internet newsgroups
  19. comp.sys.mac.programmer.help, csmp.tools and csmp.misc. It is designed for
  20. people who read news semi-regularly and want an archive of the discussions.
  21. If you don't know what a newsgroup is, you probably don't have access to
  22. it. Ask your systems administrator(s) for details. If you don't have access
  23. to news, you may still be able to post messages to the group by using a
  24. mail server like anon.penet.fi (mail help@anon.penet.fi for more
  25. information).
  26.  
  27. Each issue of the digest contains one or more sets of articles (called
  28. threads), with each set corresponding to a 'discussion' of a particular
  29. subject.  The articles are not edited; all articles included in this digest
  30. are in their original posted form (as received by our news server at
  31. nef.ens.fr).  Article threads are not added to the digest until the last
  32. article added to the thread is at least two weeks old (this is to ensure that
  33. the thread is dead before adding it to the digest).  Article threads that
  34. consist of only one message are generally not included in the digest.
  35.  
  36. The digest is officially distributed by two means, by email and ftp.
  37.  
  38. If you want to receive the digest by mail, send email to listserv@ens.fr
  39. with no subject and one of the following commands as body:
  40.     help                                Sends you a summary of commands
  41.     subscribe csmp-digest Your Name     Adds you to the mailing list
  42.     signoff csmp-digest                 Removes you from the list
  43. Once you have subscribed, you will automatically receive each new
  44. issue as it is created.
  45.  
  46. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  47. Questions related to the ftp site should be directed to
  48. scott.silver@dartmouth.edu.
  49.  
  50. -------------------------------------------------------
  51.  
  52. >From arnold@lumina.com (Brian Arnold)
  53. Subject: Explanation of color palettes
  54. Date: Thu, 15 Jun 1995 14:52:14 -0700
  55. Organization: Lumina Decision Systems, Inc.
  56.  
  57.  
  58. I read, re-read, and re-re-read the Color QuickDraw chapters, hoping to
  59. find a magic bullet for "simple" use of color.  Specifically, I want to be
  60. sure that about 7 colors are used correctly when at least 256 colors are
  61. shown, but I don't want to write a lot of code. If I use my colors without
  62. regard to the color manager or palette manager, and another application
  63. has taken up and modified available colors, my colors come out horrible.  
  64.  
  65. But every time I pick up my Inside Mac to read about the Color Manager or
  66. Palette Manager, my eyes go cross-eyed.  Surely they meant for people to
  67. do simple things?
  68.  
  69. So what's the easiest way to assure that the 7 colors I want to use are
  70. going to be correct.  I know it can be done, but I want to do it in 10
  71. lines of code or less, and I don't want to have to explain the Color
  72. Manager or Palette Manager in great detail to another engineer, should
  73. they have to modify those 10 lines in the future.
  74.  
  75. Oh, and while we're at it, is there a way to re-sort the built-in 256
  76. color palette so that colors are organized logically?  It looks like 256
  77. semi-randomly ordered colors.  (See the ResEdit 256 color palette for an
  78. example of what I'm talking about, I display it the same way and don't
  79. want to).
  80.  
  81. Tips, advice are greatly appreciated.
  82.  
  83. - Brian
  84.  
  85. -- 
  86. Brian Arnold
  87. Director of Software Development
  88. Lumina Decision Systems, Inc.
  89. http://www.lumina.com/lumina/
  90.  
  91. +++++++++++++++++++++++++++
  92.  
  93. >From "Andrew C. Plotkin" <erkyrath+@CMU.EDU>
  94. Date: Fri, 16 Jun 1995 11:37:59 -0400
  95. Organization: Carnegie Mellon, Pittsburgh, PA
  96.  
  97. arnold@lumina.com (Brian Arnold) writes:
  98. > I read, re-read, and re-re-read the Color QuickDraw chapters, hoping to
  99. > find a magic bullet for "simple" use of color.  Specifically, I want to be
  100. > sure that about 7 colors are used correctly when at least 256 colors are
  101. > shown, but I don't want to write a lot of code. If I use my colors without
  102. > regard to the color manager or palette manager, and another application
  103. > has taken up and modified available colors, my colors come out horrible.  
  104.  
  105. Ok, what you want to do is this:
  106.  
  107. Create a palette resource ('pltt', not 'clut') in ResEdit. Have it
  108. contain the colors you want, including black and white.
  109. Select all the colors (except black and white), hit the "Usage..."
  110. menu option, and set them to "Tolerant" with tolerance 0.
  111.  
  112. In your program, when you create any window, use SetPalette to set
  113. that palette. Use TRUE as the second argument so that you get update
  114. events when the device's color table changes.
  115.  
  116. Then use PmForeColor to set colors, using the index of the color in
  117. the palette. (Or RGBForeColor with the correct RGB values.) 
  118.  
  119. That should work in the simplest case: your app in the foreground and
  120. no other apps running. When other apps are in the foreground, of
  121. course, they can hog the color table for themselves. I *think* this
  122. will work when you are in the foreground and other apps are in the
  123. background, but it's probably possible for a badly-written app to hog
  124. the palette even when it's hidden. If so, there's nothing you can do
  125. about it (without being even ruder than it is.)
  126.  
  127. This is from memory, so if it doesn't work, post again.
  128.  
  129. --Z
  130.  
  131. "And Aholibamah bare Jeush, and Jaalam, and Korah: these were the borogoves..."
  132.  
  133. +++++++++++++++++++++++++++
  134.  
  135. >From h+@metrowerks.com (Jon Watte)
  136. Date: Sun, 18 Jun 1995 15:22:28 -0500
  137. Organization: <CLASSIFIED>
  138.  
  139.  
  140. In article <arnold-1506951452140001@227.rahul.net>,
  141. arnold@lumina.com (Brian Arnold) wrote:
  142.  
  143. > So what's the easiest way to assure that the 7 colors I want to use are
  144. > going to be correct.  I know it can be done, but I want to do it in 10
  145.  
  146. Create and attach a palette to your window. This is simplest done by making
  147. a 'pltt' resource with the same ID as your 'WIND' ID, adn read in your
  148. window using GetNewCWindow(). Make sure color 0 is white and 1 is black,
  149. though, else strange things happen.
  150.  
  151. Now, when you draw, call PMForeColor(x) where x is your color number
  152. (0=white, 1=black, 2=next color in palette...) to set the color you want to
  153. use. The Palette Manager will try and make every reasonable effort to keep
  154. your colors true on screen.
  155.  
  156. You should set your colors to be pmTolerant, with a tolerance of 0.
  157. pmCorteous colors will NOT be as kindly treated. pmExplicit and/or
  158. pmAnimated colors are only for special tricks, like lava lamps and fades.
  159.  
  160. > Oh, and while we're at it, is there a way to re-sort the built-in 256
  161. > color palette so that colors are organized logically?  It looks like 256
  162.  
  163. Not really. If every program wanted to set the actual index used in video
  164. memory, you'd get contention for the indexes. The palette manager defines
  165. logical numbers you can use, which it maps to a physical index that noone
  166. else uses.
  167.  
  168. Cheers,
  169.  
  170.                                 / h+
  171.  
  172.  
  173.  
  174.  
  175. ---------------------------
  176.  
  177. >From carytork@aol.com (CaryTork)
  178. Subject: MoveControl for Modeless Dialogs
  179. Date: 19 Jun 1995 21:30:00 -0400
  180. Organization: America Online, Inc. (1-800-827-6364)
  181.  
  182. I am using MoveControl in a modeless dialog.  However, if I move the
  183. control, I no longer get mouse click events on that control in my
  184. DialogSelect call.  In other words, if I do _not_ move the control (just
  185. let it stay where it is when I created it with ResEdit), DialogSelect
  186. properly returns true (with the control ID) when the user clicks on the
  187. push button.  However, if I move the control with MoveControl first, when
  188. I click on the button, nothing happens and DialogSelect returns false.  In
  189. the moved control case, the button isn't even highlighted when I click on
  190. it.  Am I missing something fundamental here?  Here's a sample of the code
  191. I'm using:
  192.  
  193.   MoveControl( GetItemHandle( pDialogScores, PB_CLEAR ), rectScores.right
  194. - 180,
  195.          rectScores.bottom - 20 );
  196.  
  197.  if ( DialogSelect( pEvent, &pDialog, &sItem ) )
  198.     ProcessScoresButtonClick( sItem );
  199.  
  200. One last note of interest.  I have another routine handle keyboard events
  201. for this modeless dialog, which highlights the control if enter/return is
  202. pressed.  That highlighting works just fine whether the control is moved
  203. or not.  Any help in this matter would be greatly appreciated.
  204.  
  205. Cary
  206.  
  207. +++++++++++++++++++++++++++
  208.  
  209. >From bb@lightside.com (Bob Bradley)
  210. Date: Tue, 20 Jun 1995 02:23:35 -0700
  211. Organization: SPC
  212.  
  213. In article <3s58ao$jo5@newsbf02.news.aol.com>, carytork@aol.com (CaryTork)
  214. wrote:
  215.  
  216. >I am using MoveControl in a modeless dialog.  However, if I move the
  217. >control, I no longer get mouse click events on that control in my
  218. >DialogSelect call.  In other words, if I do _not_ move the control (just
  219. >let it stay where it is when I created it with ResEdit), DialogSelect
  220. >properly returns true (with the control ID) when the user clicks on the
  221. >push button.  However, if I move the control with MoveControl first, when
  222. >I click on the button, nothing happens and DialogSelect returns false.  In
  223. >the moved control case, the button isn't even highlighted when I click on
  224. >it.  Am I missing something fundamental here?  Here's a sample of the code
  225. >I'm using:
  226.  
  227. I think the problem is that you are moving the control without telling the
  228. Dialog Manager. After moving the control, use SetDialogItem to set the
  229. controls' new location (with the iRect parameter).
  230.  
  231. +++++++++++++++++++++++++++
  232.  
  233. >From dstone@chem.utoronto.ca (David Stone)
  234. Date: Tue, 20 Jun 1995 13:02:56 GMT
  235. Organization: University of Toronto Chemistry
  236.  
  237. In article <bb-2006950223350001@user43.lightside.com>, bb@lightside.com
  238. (Bob Bradley) wrote:
  239. > In article <3s58ao$jo5@newsbf02.news.aol.com>, carytork@aol.com (CaryTork)
  240. > wrote:
  241. > >I am using MoveControl in a modeless dialog.  However, if I move the
  242. > >control, I no longer get mouse click events on that control in my
  243. > >DialogSelect call. 
  244. =====snip=========
  245. > I think the problem is that you are moving the control without telling the
  246. > Dialog Manager. After moving the control, use SetDialogItem to set the
  247. > controls' new location (with the iRect parameter).
  248.  
  249. I think this is right - the dialog manager keeps it's own list of item
  250. rectangles separate from the control's contrlRect.  In the original case
  251. HiliteControl works because it uses the rect in the ControlRecord, not
  252. the dialog item list.  The same thing happens in modal dialogs...
  253.  
  254. Dave Stone
  255.  
  256. +++++++++++++++++++++++++++
  257.  
  258. >From Dave Overton <doverton@iglou.com>
  259. Date: Tue, 20 Jun 1995 21:20:07 GMT
  260. Organization: DataStream Imaging Systems, Inc.
  261.  
  262. You also have to call GetDItem() and SetDItem() with the changed
  263. rectangle to let
  264. the dialog manager know you have moved the item.
  265. ie
  266.  
  267. GetDItem ( dialog, itemNo, &kind, &handle, &rect );
  268. rect.left = newleft;
  269. rect.right = newright;
  270. rect.top = newtop;
  271. rect.bottom = newbottom;
  272. SetDItem ( dialog, itemNo, kind, handle, &rect );
  273.  
  274. Dave Overton
  275.  
  276. +++++++++++++++++++++++++++
  277.  
  278. >From carytork@aol.com (CaryTork)
  279. Date: 20 Jun 1995 22:50:51 -0400
  280. Organization: America Online, Inc. (1-800-827-6364)
  281.  
  282. >>I think the problem is that you are moving the control without telling
  283. the
  284. >>Dialog Manager. After moving the control, use SetDialogItem to set the
  285. >>controls' new location (with the iRect parameter).
  286.  
  287. Thanks!  SetDItem() is exactly what I needed to do to get things to work
  288. correctly.  I appreaciate the help.
  289.  
  290. Cary
  291.  
  292. ---------------------------
  293.  
  294. >From rsandhu@cs.ucl.ac.uk (Raghbir Sandhu)
  295. Subject: Opening Control Panels from within an Application
  296. Date: Wed, 14 Jun 1995 12:49:53 GMT
  297. Organization: University College London
  298.  
  299. Hi,
  300.  
  301. I am working on small project where I need to open the ConfigPPP control panel,
  302. set a few parameters and then perform the dial-up. What I want to know is there
  303. a way of doing this from WITHIN the application itself? I don't want to rely on
  304. AppleScript code to do this.
  305.  
  306. Any help is much appreciated.
  307.  
  308. Response by email please.
  309.  
  310.  
  311. Thanks,
  312.  
  313. Raghbir
  314. rsandhu@cs.ucl.ac.uk
  315.  
  316. +++++++++++++++++++++++++++
  317.  
  318. >From andrew@adcode.demon.co.uk (Andrew Crane)
  319. Date: 18 Jun 1995 21:09:39 +0100
  320. Organization: Adcode
  321.  
  322. In article <rsandhu.803134193@cs.ucl.ac.uk>, rsandhu@cs.ucl.ac.uk (Raghbir Sandhu) wrote:
  323.  
  324. : I am working on small project where I need to open the ConfigPPP control panel,
  325. : set a few parameters and then perform the dial-up. What I want to know is there
  326. : a way of doing this from WITHIN the application itself? I don't want to rely on
  327. : AppleScript code to do this.
  328. :
  329. : Any help is much appreciated.
  330.  
  331. You may be better off doing it in a script anyway - at some stage you will have to poke an event into the queue to simulate the mouse-down on the Open button and then the go-away box.
  332.  
  333. You can invoke it quite easily with OpenDeskAcc, as any interactive application can be opened in this way (that's how you implement the apple menu). The opened application then takes over as the foreground task and you're behind it. If you have elected to receive background time, you can check that it has opened, poke your events at it, tell it to go away and regain control as the foreground Appl.
  334.  
  335. Andrew
  336.  
  337. -- 
  338. Andrew Crane, Egham, Surrey, England
  339.  
  340. +++++++++++++++++++++++++++
  341.  
  342. >From peter@mail.peter.com.au (Peter Lewis)
  343. Date: Tue, 20 Jun 1995 17:03:22 +0800
  344. Organization: iiNET Technologies
  345.  
  346. [Sorry, I appear to be posting source code to alt.sources.mac.  I know
  347. this is breaking a long standtion of posting only discussion, but I
  348. couldn't help myself]
  349.  
  350. In article <rsandhu.803134193@cs.ucl.ac.uk>, rsandhu@cs.ucl.ac.uk (Raghbir
  351. Sandhu) wrote:
  352.  
  353. >I am working on small project where I need to open the ConfigPPP control panel,
  354. >set a few parameters and then perform the dial-up. What I want to know is there
  355. >a way of doing this from WITHIN the application itself? I don't want to rely on
  356. >AppleScript code to do this.
  357.  
  358. I'm not sure if this will solve your problem, but it gives me a chance to
  359. post my process handling code.  The following uses AppleEvents (not
  360. AppleScript) to control the scriptable finder to open a control panel.  It
  361. also has lots of other neat process handling code.
  362.  
  363. Enjoy,
  364.    Peter.
  365.  
  366. unit MyProcesses;
  367.  
  368. interface
  369.  
  370.    uses
  371.       Types, Files, Memory, Processes;
  372.  
  373.    const
  374.       application = 'APPL';
  375.  
  376.    function FindApplication (creator: OSType; var fs: FSSpec): OSErr;
  377.    function FindProcess (creator, typ: OSType; var process:
  378. ProcessSerialNumber; var fs: FSSpec): boolean;
  379.    function LaunchWithDocument (creator, typ: OSType; fs: FSSpec; tofront:
  380. boolean):OSErr;
  381.    function LaunchApp (creator, typ: OSType; tofront: boolean):OSErr;
  382.    procedure QuitApplication (creator, typ: OSType);
  383.    function LaunchFSSpec (var fs: FSSpec; tofront: boolean):OSErr;
  384.    function FindControlPanel (fcreator: OSType; var fs: FSSpec): OSErr;
  385.    function TellFinderToLaunch (fs: FSSpec; tofront: boolean): boolean;
  386.    function OpenControlPanel (fcreator: OSType): boolean;
  387.  
  388. implementation
  389.  
  390.    uses
  391.       AppleEvents, Aliases, MySystemGlobals, MyUtils, MyAEUtils, Folders,
  392. GestaltEqu;
  393.  
  394.    procedure AddFSSToAEList (var list: AEDescList; row: integer; var fs:
  395. FSSpec);
  396.       var
  397.          fileAlias: AliasHandle;
  398.          err: OSErr;
  399.    begin
  400.       err := NewAlias(nil, fs, fileAlias);
  401.       if err = noErr then begin
  402.          HLock(handle(fileAlias));
  403.          err := AEPutPtr(list, row, typeAlias, ptr(fileAlias^),
  404. fileAlias^^.aliasSize);
  405.          DisposeHandle(handle(fileAlias));
  406.       end;
  407.    end;
  408.  
  409.    function FindControlPanel (fcreator: OSType; var fs: FSSpec): OSErr;
  410.       var
  411.          pb: HParamBlockRec;
  412.          i: integer;
  413.          err: OSErr;
  414.    begin
  415.       err := FindFolder(kOnSystemDisk, kControlPanelFolderType, false,
  416. fs.vRefNum, fs.parID);
  417.       if err = noErr then begin
  418.          i := 1;
  419.          repeat
  420.             pb.ioNamePtr := @fs.name;
  421.             pb.ioVRefNum := fs.vRefNum;
  422.             pb.ioDirID := fs.parID;
  423.             pb.ioFDirIndex := i;
  424.             i := i + 1;
  425.             err := PBHGetFInfoSync(@pb);
  426.             if err = noErr then begin
  427.                if (pb.ioFlFndrInfo.fdType = 'cdev') &
  428. (pb.ioFlFndrInfo.fdCreator = fcreator) then begin
  429.                   leave;
  430.                end;
  431.             end;
  432.          until (err <> noErr);
  433.       end;
  434.       FindControlPanel := err;
  435.    end;
  436.  
  437.    function TellFinderToLaunch (fs: FSSpec; tofront: boolean): boolean;
  438.       var
  439.          process: ProcessSerialNumber;
  440.          err, junk: OSErr;
  441.          targetAddress: AEDesc;
  442.          fileList: AEDescList;
  443.          theEvent, theReply: AppleEvent;
  444.          sendmode: AESendMode;
  445.          gv: longInt;
  446.          finder_fs: FSSpec;
  447.    begin
  448.       err := -1;
  449.       if (Gestalt(gestaltFinderAttr, gv) = noErr) & BTST(gv,
  450. gestaltOSLCompliantFinder) then begin
  451.          if FindProcess('MACS', 'FNDR', process, finder_fs) then begin
  452.             AECreate(theEvent);
  453.             AECreate(theReply);
  454.             AECreate(fileList);
  455.             AECreate(targetAddress);
  456.             err := AECreateDesc(typeProcessSerialNumber, @process,
  457. sizeof(process), targetAddress);
  458.             if err = noErr then begin
  459.                err := AECreateAppleEvent(kCoreEventClass,
  460. kAEOpenDocuments, targetAddress, kAutoGenerateReturnID, kAnyTransactionID,
  461. theEvent);
  462.             end;
  463.             AEDestroy(targetAddress);
  464.             if err = noErr then begin
  465.                err := AECreateList(nil, 0, false, fileList);
  466.             end;
  467.             if err = noErr then begin
  468.                AddFSSToAEList(fileList, 1, fs);
  469.             end;
  470.             if err = noErr then begin
  471.                err := AEPutParamDesc(theEvent, keyDirectObject, fileList);
  472.             end;
  473.             if err = noErr then begin
  474.                sendmode := kAENoReply;
  475.                if not tofront then begin
  476.                   sendmode := sendmode + kAENeverInteract;
  477.                end;
  478.                err := AESend(theEvent, theReply, sendmode,
  479. kAEHighPriority, kNoTimeOut, nil, nil);
  480.             end;
  481.             AEDestroy(theEvent);
  482.             AEDestroy(theReply);
  483.             AEDestroy(fileList);
  484.             if (err = noErr) & tofront then begin
  485.                junk := SetFrontProcess(process);
  486.             end;
  487.          end;
  488.       end;
  489.       TellFinderToLaunch := err = noErr;
  490.    end;
  491.  
  492.    function OpenControlPanel (fcreator: OSType): boolean;
  493.       var
  494.          fs: FSSpec;
  495.    begin
  496.       OpenControlPanel := false;
  497.       if FindControlPanel(fcreator, fs) = noErr then begin
  498.          OpenControlPanel := TellFinderToLaunch(fs, true);
  499.       end;
  500.    end;
  501.  
  502.    function ConfirmApplicationExists (creator: OSType; var fs: FSSpec): OSErr;
  503.       var
  504.          err: OSErr;
  505.          info: FInfo;
  506.    begin
  507.       err := HGetFInfo(fs.vRefNum, fs.parID, fs.name, info);
  508.       if err = noErr then begin
  509.          if (info.fdType <> 'APPL') or (info.fdCreator <> creator) then begin
  510.             err := afpItemNotFound;
  511.          end; (* if *)
  512.       end; (* if *)
  513.       ConfirmApplicationExists := err;
  514.    end;
  515.  
  516.    function FindApplication (creator: OSType; var fs: FSSpec): OSErr;
  517.       var
  518.          i: integer;
  519.          pbdt: DTPBRec;
  520.          crdate: longInt;
  521.          oe: OSErr;
  522.          found: boolean;
  523.    begin
  524.       found := false;
  525.       if system7 then begin
  526.          i := 1;
  527.          repeat
  528.             fs.vRefNum := 0;
  529.             oe := GetVolInfo(fs.name, fs.vRefNum, i, crdate);
  530.             i := i + 1;
  531.             if oe = noErr then begin
  532.                with pbdt do begin
  533.                   fs.name := '';
  534.                   ioNamePtr := @fs.name;
  535.                   ioVRefNum := fs.vRefNum;
  536.                   oe := PBDTGetPath(@pbdt);
  537.                   if oe = noErr then begin
  538.                      ioIndex := 0;
  539.                      ioFileCreator := creator;
  540.                      oe := PBDTGetAPPLSync(@pbdt);
  541.                      if oe = noErr then begin
  542.                         fs.parID := pbdt.ioAPPLParID;
  543.                         found := ConfirmApplicationExists(creator,fs)=noErr;
  544.                      end;
  545.                   end;
  546.                end;
  547.                oe := noErr;
  548.             end;
  549.          until found or (oe <> noErr);
  550.       end;
  551.       if found then begin
  552.          oe := noErr;
  553.       end
  554.       else begin
  555.          oe := afpItemNotFound;
  556.          fs.vRefNum := 0;
  557.          fs.parID := 2;
  558.          fs.name := '';
  559.       end;
  560.       FindApplication := oe;
  561.    end;
  562.  
  563.    function FindProcess (creator, typ: OSType; var process:
  564. ProcessSerialNumber; var fs: FSSpec): boolean;
  565.       var
  566.          info: ProcessInfoRec;
  567.          gv: longInt;
  568.    begin
  569.       FindProcess := false;
  570.       if (Gestalt(gestaltOSAttr, gv) = noErr) & (BTST(gv,
  571. gestaltLaunchControl)) then begin
  572.          process.highLongOfPSN := 0;
  573.          process.lowLongOfPSN := kNoProcess;
  574.          info.processInfoLength := sizeof(ProcessInfoRec);
  575.          info.processName := nil;
  576.          info.processAppSpec := @fs;
  577.          while GetNextProcess(process) = noErr do begin
  578.             if GetProcessInformation(process, info) = noErr then begin
  579.                if (info.processType = longInt(typ)) and
  580. (info.processSignature = creator) then begin
  581.                   FindProcess := true;
  582.                   leave;
  583.                end;
  584.             end;
  585.          end;
  586.       end;
  587.    end;
  588.  
  589.    procedure PrepareToLaunch (var theEvent: AppleEvent; tofront: boolean;
  590. var launchDesc: AEDesc; var launchThis: LaunchParamBlockRec);
  591.       var
  592.          oe: OSErr;
  593.    begin
  594.       oe := AECoerceDesc(theEvent, typeAppParameters, launchDesc);
  595.       HLock(handle(theEvent.dataHandle));
  596.       launchThis.launchAppParameters :=
  597. AppParametersPtr(launchDesc.dataHandle^);
  598.       launchThis.launchBlockID := extendedBlock;
  599.       launchThis.launchEPBLength := extendedBlockLen;
  600.       launchThis.launchFileFlags := 0;
  601.       launchThis.launchControlFlags := launchContinue + launchNoFileFlags;
  602.       if not tofront then begin
  603.          launchThis.launchControlFlags := launchThis.launchControlFlags +
  604. launchDontSwitch;
  605.       end;
  606.    end;
  607.  
  608.    function LaunchApplicationOptionallyMinimum(var launchThis:
  609. LaunchParamBlockRec):OSErr;
  610.       var
  611.          err:OSErr;
  612.    begin
  613.       err := LaunchApplication(@launchThis);
  614.       if err = memFullErr then begin
  615.          launchThis.launchControlFlags :=
  616. BOR(launchThis.launchControlFlags, launchUseMinimum);
  617.          err := LaunchApplication(@launchThis);
  618.       end;
  619.       LaunchApplicationOptionallyMinimum:=err;
  620.    end;
  621.    
  622.    function LaunchWithDocument (creator, typ: OSType; fs: FSSpec; tofront:
  623. boolean):OSErr;
  624.       var
  625.          psn: ProcessSerialNumber;
  626.          targetAddress: AEDesc;
  627.          theEvent, theReply: AppleEvent;
  628.          fileList: AEDescList;
  629.          launchDesc: AEDesc;
  630.          app_fs: FSSpec;
  631.          launchThis: LaunchParamBlockRec;
  632.          oe: OSErr;
  633.          gv: longInt;
  634.          sendmode: AESendMode;
  635.          t, c: longInt;
  636.    begin
  637.       LaunchWithDocument := -1;
  638.       PurgeSpace(t, c);
  639.       if (Gestalt(gestaltOSAttr, gv) = noErr) & (BTST(gv,
  640. gestaltLaunchControl)) & (c > 4096) then begin
  641.          if FindProcess(creator, typ, psn, app_fs) then begin
  642.             oe := AECreateDesc(typeProcessSerialNumber, @psn, sizeof(psn),
  643. targetAddress);
  644.             oe := AECreateAppleEvent(kCoreEventClass, kAEOpenDocuments,
  645. targetAddress, kAutoGenerateReturnID, kAnyTransactionID, theEvent);
  646.             oe := AEDisposeDesc(targetAddress);
  647.             oe := AECreateList(nil, 0, false, fileList);
  648.             AddFSSToAEList(fileList, 1, fs);
  649.             oe := AEPutParamDesc(theEvent, keyDirectObject, fileList);
  650.             sendmode := kAENoReply;
  651.             if not tofront then begin
  652.                sendmode := sendmode + kAENeverInteract;
  653.             end;
  654.             oe := AESend(theEvent, theReply, sendmode, kAEHighPriority,
  655. kNoTimeOut, nil, nil);
  656.             oe := AEDisposeDesc(theEvent);
  657.             oe := AEDisposeDesc(theReply);
  658.             oe := AEDisposeDesc(fileList);
  659.             if tofront then begin
  660.                LaunchWithDocument := SetFrontProcess(psn);
  661.             end;
  662.          end
  663.          else begin
  664.             if FindApplication(creator, app_fs) = noErr then begin
  665.                oe := AECreateDesc(typeApplSignature, @creator,
  666. sizeof(creator), targetAddress);
  667.                oe := AECreateAppleEvent(kCoreEventClass, kAEOpenDocuments,
  668. targetAddress, kAutoGenerateReturnID, kAnyTransactionID, theEvent);
  669.                oe := AEDisposeDesc(targetAddress);
  670.                oe := AECreateList(nil, 0, false, fileList);
  671.                AddFSSToAEList(fileList, 1, fs);
  672.                oe := AEPutParamDesc(theEvent, keyDirectObject, fileList);
  673.                launchThis.launchAppSpec := @app_fs;
  674.                PrepareToLaunch(theEvent, tofront, launchDesc, launchThis);
  675.                LaunchWithDocument :=
  676. LaunchApplicationOptionallyMinimum(launchThis);
  677.                oe := AEDisposeDesc(theEvent);
  678.                oe := AEDisposeDesc(fileList);
  679.             end;
  680.          end;
  681.       end;
  682.    end;
  683.  
  684.    function LaunchFSSpec (var fs: FSSpec; tofront: boolean):OSErr;
  685.       var
  686.          gv: longInt;
  687.          launchThis: LaunchParamBlockRec;
  688.    begin
  689.       LaunchFSSpec := -1;
  690.       if (Gestalt(gestaltOSAttr, gv) = noErr) & (BTST(gv,
  691. gestaltLaunchControl)) then begin
  692.          launchThis.launchBlockID := extendedBlock;
  693.          launchThis.launchEPBLength := extendedBlockLen;
  694.          launchThis.launchFileFlags := 0;
  695.          launchThis.launchControlFlags := launchContinue +
  696. launchNoFileFlags + launchUseMinimum;
  697.          if not tofront then begin
  698.             launchThis.launchControlFlags := launchThis.launchControlFlags
  699. + launchDontSwitch;
  700.          end;
  701.          launchThis.launchAppSpec := @fs;
  702.          launchThis.launchAppParameters := nil;
  703.          LaunchFSSpec := LaunchApplicationOptionallyMinimum(launchThis);
  704.       end;
  705.    end;
  706.  
  707.    function LaunchApp (creator, typ: OSType; tofront: boolean):OSErr;
  708.       var
  709.          psn: ProcessSerialNumber;
  710.          app_fs: FSSpec;
  711.          gv: longInt;
  712.    begin
  713.       LaunchApp := -1;
  714.       if (Gestalt(gestaltOSAttr, gv) = noErr) & (BTST(gv,
  715. gestaltLaunchControl)) then begin
  716.          if FindProcess(creator, typ, psn, app_fs) then begin
  717.             if tofront then begin
  718.                LaunchApp := SetFrontProcess(psn);
  719.             end;
  720.          end
  721.          else begin
  722.             if FindApplication(creator, app_fs) = noErr then begin
  723.                LaunchApp := LaunchFSSpec(app_fs, tofront);
  724.             end;
  725.          end;
  726.       end;
  727.    end;
  728.  
  729.    procedure QuitApplication (creator, typ: OSType);
  730.       var
  731.          process: processSerialNumber;
  732.          targetAddress: AEAddressDesc;
  733.          AEvent, AReply: AppleEvent;
  734.          fs: FSSpec;
  735.          oe: OSErr;
  736.    begin
  737.       if FindProcess(creator, typ, process, fs) then begin
  738.          oe := AECreateDesc(typeProcessSerialNumber, @process,
  739. SizeOf(process), targetAddress);
  740.          oe := AECreateAppleEvent(kCoreEventClass, kAEQuitApplication,
  741. targetAddress, kAutoGenerateReturnID, kAnyTransactionID, AEvent);
  742.          oe := AEDisposeDesc(targetAddress);
  743.          oe := AESend(AEvent, AReply, kAENoReply, kAEHighPriority, 5 * 60,
  744. nil, nil);
  745.          oe := AEDisposeDesc(AEvent);
  746.          oe := AEDisposeDesc(AReply);
  747.       end;
  748.    end;
  749.  
  750. end.
  751. -- 
  752. And lo, NewsWatcher did say 
  753.   "comp.sys.mac.programmer: Group deleted on news server."
  754. Let February 7 hence forth be know as a day of mourning.
  755.  
  756. ---------------------------
  757.  
  758. >From rpa@netcom.com (Ramin Firoozye)
  759. Subject: QT2.0 & NewMovieFromUserProc help...
  760. Date: Wed, 21 Jun 1995 17:56:16 GMT
  761. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  762.  
  763. [ I posted this on c.s.m.p but found it had been rendered defunct...
  764.   Here it is again. Sorry for the duplication. R]
  765.  
  766. - -
  767. [ This is a question for those who have dabbled in the bowels of the 
  768. QuickTime 2.0 SDK... I'm also hoping someone from Apple may get this
  769. and get it to the right person. - R.]
  770.  
  771. I was playing around with the new call "NewMovieFromUserProc".
  772. I'm wondering if maybe I'm missing something. The description in the 
  773. manual (pp 3-6) is somewhat confusing.
  774.  
  775. I have a simple movie which has been converted for non-mac use.
  776. I open the file using stdio calls. Then I use NewMovieFromUserProc
  777. and give it my own GetMovie procptr. As the refCon, I pass down
  778. the file descriptor for the opened movie file. It calls my procptr and 
  779. asks for 8-bytes from offset 0. This all works great, no problems until
  780. NewMovieFromUserProc returns with a noMovieFound error.
  781.  
  782. The description of the user-specified routine MyGetMovieProc says that it 
  783. is passed an offset value that "specifies the offset into the movie resource
  784. (not the movie file). This is the location from which your function
  785. retrieves the movie data."
  786.  
  787. I thought NewMovieFromUserProc was there so you could use it to get movie
  788. data. But the description all of a sudden says the offset is into the
  789. movie resource "NOT THE MOVIE FILE". Huh? Anyway, I had already converted 
  790. the movie for non-mac use so all stuff was to come out of the data fork
  791. anyway. Right?
  792.  
  793. For defaultDataRef I pass it a nil, since I've already opened the file
  794. myself. For dataRefType, I pass it 'alis' (the other choice being
  795. 'hndl'). I was under the impression that specifying a nil defaultDataRef
  796. meant the movie toolbox wouldn't try to do anything and would just
  797. let me take care of all I/O.
  798.  
  799. I think I'm missing a crucial bit here. And the docs don't help clarify
  800. things...
  801.  
  802. If I am to write my own data handler, then I thought the movie toolbox would
  803. invoke my read routines via DHScheduleData, so what do I need this 
  804. getProcptr business for?
  805.  
  806. On the other hand, if I can just use this function to get the data
  807. myself, why would I need a data handler? And why do I need to screw 
  808. around with the resource fork? It seems the notion of the the getProcptr 
  809. duplicates the data handler's DHScheduleData stuff. Or is it the case 
  810. that *I'M* supposed to initiate DHScheduleData from inside the getProcptr. 
  811. Holy bat-wings. It keeps getting curioser and curioser.
  812.  
  813. Any help, pointers, tips would be greatly appreciated. 
  814.  
  815. Please, please, please, reply by mail and I'll summarize. I can never 
  816. get through the whole csmp backlog.
  817.  
  818. Thanks,
  819. Ramin. - rpa@netcom.com - Phone: (415) 826-3113.
  820. -- 
  821. Ramin Firoozye' -- rp&A Inc.
  822. San Francisco, California.
  823. Internet: rpa@netcom.com --- CompuServe: 70751, 252
  824.  
  825. +++++++++++++++++++++++++++
  826.  
  827. >From ivanski@world.std.com (Ivan M CaveroBelaunde)
  828. Date: Wed, 21 Jun 1995 22:06:17 GMT
  829. Organization: The World Public Access UNIX, Brookline, MA
  830.  
  831. rpa@netcom.com (Ramin Firoozye) writes:
  832. >[ I posted this on c.s.m.p but found it had been rendered defunct...
  833. >  Here it is again. Sorry for the duplication. R]
  834. >---
  835. >[ This is a question for those who have dabbled in the bowels of the 
  836. >QuickTime 2.0 SDK... I'm also hoping someone from Apple may get this
  837. >and get it to the right person. - R.]
  838.  
  839. >I was playing around with the new call "NewMovieFromUserProc".
  840. >I'm wondering if maybe I'm missing something. The description in the 
  841. >manual (pp 3-6) is somewhat confusing.
  842.  
  843. You're misunderstanding the purpose of NewMovieFromUserProc.
  844. The NewMovieWhatever calls basically read in a "public movie", a chunk
  845. of data in the format defined by MoviesFormat.h and the QT docs.
  846. The "public movie" is basically a *descriptor* for the actual
  847. media data and how it plays (tracks, media, timescales, spatial size,
  848. duration, etc.) but does not contain any of the actual *sample* data.
  849. Mac-centric QT movies stored the public movie in the 'moov' resource
  850. in the resource fork. Cross-platform QT movies store the public movie
  851. at the end of the data fork (with some twists; xplatform movies are
  852. actually composed of "atoms" [chunks of the file with an 8-byte
  853. header identifying the chunk and its length], of which the
  854. public movie is one). NewMovieFromUserProc allows you to feed in
  855. the data normally stored in the public movie (either the resource
  856. or the "public movie atom" at the end of a xplatform movie) from
  857. any source; it could be, for example, algorithmically generated
  858. (make for some funny movies).
  859.  
  860. >I have a simple movie which has been converted for non-mac use.
  861. >I open the file using stdio calls. Then I use NewMovieFromUserProc
  862. >and give it my own GetMovie procptr. As the refCon, I pass down
  863. >the file descriptor for the opened movie file. It calls my procptr and 
  864. >asks for 8-bytes from offset 0. This all works great, no problems until
  865. >NewMovieFromUserProc returns with a noMovieFound error.
  866.  
  867. If you have a standard xplatform QT movie you should just use
  868. the standard NewMovieFromFile and OpenMovieFile calls with the
  869. magical movieInDataForkResID for the res ID in the call.
  870.  
  871. <SNIKT>
  872.  
  873. >I thought NewMovieFromUserProc was there so you could use it to get movie
  874. >data. But the description all of a sudden says the offset is into the
  875. >movie resource "NOT THE MOVIE FILE". Huh? Anyway, I had already converted 
  876. >the movie for non-mac use so all stuff was to come out of the data fork
  877. >anyway. Right?
  878.  
  879. Nope; NewMovieFromUserProc is not for getting the data as explained
  880. above. If you want to get at the movie data you need to use the
  881. GetMediaSample/GetMediaSampleReference calls. Navigation can be
  882. quite tricky as the QT hierarchy (Movie contains any number of tracks,
  883. potentially layered together; each track is an edit list of the media;
  884. media is a time-ordered sequence of samples; samples are chunk of
  885. raw data which sit in a file and are interpreted by the appropriate
  886. media handler) can allow for extremely complex combinations that
  887. can be really hard to walk.
  888.  
  889. Oh, and the data handlers have nothing to do with this. Data handlers
  890. sit below the media handlers and fetch the data for it.
  891.  
  892. -Ivan
  893. - -
  894. Ivan Cavero Belaunde                                 (ivanski@world.std.com)
  895.  
  896. ---------------------------
  897.  
  898. >From davewise@aol.com (DaveWise)
  899. Subject: Selecting a DA
  900. Date: 20 Jun 1995 12:53:34 -0400
  901. Organization: America Online, Inc. (1-800-827-6364)
  902.  
  903. Ok. I am new to programming so go slow. I made an app that has a window
  904. this is very exciting for me. Now I want to add apple menu options as
  905. well. I have an about window which is cool but I can't get items in the
  906. apple menu other that my about to launch while my window is open. I am
  907. using openDeskAcc or whatever that toolbox call is. And as soon as I close
  908. my window the item that I chose (usually the calculator) is launched.
  909.  
  910. +++++++++++++++++++++++++++
  911.  
  912. >From andrew@adcode.demon.co.uk (Andrew Crane)
  913. Date: 20 Jun 1995 23:10:12 +0100
  914. Organization: Adcode
  915.  
  916. In article <3s6uee$1dg@newsbf02.news.aol.com>, davewise@aol.com (DaveWise) wrote:
  917.  
  918. : Ok. I am new to programming so go slow. I made an app that has a window
  919. : this is very exciting for me. Now I want to add apple menu options as
  920. : well. I have an about window which is cool but I can't get items in the
  921. : apple menu other that my about to launch while my window is open. I am
  922. : using openDeskAcc or whatever that toolbox call is. And as soon as I close
  923. : my window the item that I chose (usually the calculator) is launched.
  924.  
  925. In article <3s6uee$1dg@newsbf02.news.aol.com>, davewise@aol.com (DaveWise) wrote:
  926.  
  927. : Ok. I am new to programming so go slow. I made an app that has a window
  928. : this is very exciting for me. Now I want to add apple menu options as
  929. : well. I have an about window which is cool but I can't get items in the
  930. : apple menu other that my about to launch while my window is open. I am
  931. : using openDeskAcc or whatever that toolbox call is. And as soon as I close
  932. : my window the item that I chose (usually the calculator) is launched.
  933.  
  934. 1. Need to add the desk accessories to the menu:
  935.  
  936.             AddResMenu(AppleMenu,'DRVR');
  937.  
  938. where AppleMenu is a handle to your apple menu's resource.
  939.  
  940. 2. In your event loop, when a menu item is chosen in the mouseDown section, respond like this: (forget about the Boolean return - I've just pulled this from an unfinished application). The MenuItem variable is derived from the 
  941.  
  942. Boolean HandleAppleMenuChoice(short MenuItem) // ------------------------
  943. {
  944. #define  mAboutBox 16000
  945.  
  946. Str63 DeskAccName;
  947. short DeskAccNumber;
  948.          if (MenuItem == 1)
  949.                DisplayStandardAbout();
  950.          else
  951.             {
  952.             GetItem(AppleMenu, MenuItem, DeskAccName);
  953.             DeskAccNumber = OpenDeskAcc(DeskAccName);
  954.             }
  955.          return false;
  956. }
  957.  
  958.  
  959. Other bits may help:
  960. to get the MenuChoice from the mouseDown event:
  961.                   MenuChoice = MenuSelect(TheEvent.where);
  962.  
  963. To get the menu pad and menu item numbers from MenuChoice:
  964.                   TheMenu = HiWord(MenuChoice);
  965.                   MenuItem = LoWord(MenuChoice);
  966.  
  967. (MenuItem was passed to the routine above).
  968.  
  969. Regards
  970. Andrew,
  971.  
  972. -- 
  973. Andrew Crane, Egham, Surrey, England
  974.  
  975. +++++++++++++++++++++++++++
  976.  
  977. >From larson@base.cs.ucla.edu (Christopher Larson)
  978. Date: 21 Jun 1995 19:12:38 GMT
  979. Organization: UCLA, Computer Science Department
  980.  
  981. In article <3s6uee$1dg@newsbf02.news.aol.com> davewise@aol.com (DaveWise) writes:
  982. >Ok. I am new to programming so go slow. I made an app that has a window
  983. >this is very exciting for me. Now I want to add apple menu options as
  984. >well. I have an about window which is cool but I can't get items in the
  985. >apple menu other that my about to launch while my window is open. I am
  986. >using openDeskAcc or whatever that toolbox call is. And as soon as I close
  987. >my window the item that I chose (usually the calculator) is launched.
  988.  
  989. Your event queue is getting clogged with update events. You need to
  990. respond to update events by calling BeginUpdate(), drawing the contents of
  991. your window, and then calling EndUpdate(). If you don't want to draw anything,
  992. fine, but yu still need to call BeginUpdate() and EndUpdate() or you will
  993. continuously receive update events and no background processes will recieve
  994. CPU time.
  995.  
  996. --Chris
  997. _______________________________________________________________________________
  998. Chris Larson -- Amateur Macintosh Geek, CoBase Research Assistant
  999. L.A. Institute of Slowly and Painfully Working Out the Surprisingly Obvious
  1000. - -------------------------------------+---------------------------------------
  1001. (Insert Disclaimer Here)               | Who's the man ridin' in the sun?
  1002. UCLA Bruins--1995 NCAA Men's Basketball| Who's the man with the itchy gun?
  1003.              National Champions (yea!) | Who's the man who kills for fun?
  1004. Internet: larson@kingston.cs.ucla.edu  | Psycho Dad, Psycho Dad, PSYCHO DAD!
  1005.  
  1006. ---------------------------
  1007.  
  1008. >From P.T.Russell@sussex.ac.uk (Paul Russell)
  1009. Subject: Sound Manager - handling underrun in double-buffered playback ?
  1010. Date: Mon, 12 Jun 1995 16:53:40 +0100
  1011. Organization: Experimental Psychology, Sussex University
  1012.  
  1013. If my doubleback procedure takes too long to execute, is there a
  1014. possiblity that it will get called reentrantly to fill the next buffer,
  1015. before it has finished filling the current one ? Or does the Sound Manager
  1016. remember that the previous buffer has not yet been filled and generate an
  1017. error ?
  1018.  
  1019. I would guess that the former must be the case, since my application
  1020. crashes if I try to do too much work in the doubleback procedure, but
  1021. works fine otherwise. Does this mean that I need to keep track of whether
  1022. I'm being called reentrantly and handle the underrun error condition
  1023. accordingly ?
  1024.  
  1025. //Paul
  1026. -- 
  1027. | Paul Russell              | Internet:  P.T.Russell@sussex.ac.uk |
  1028. | Experimental Psychology   | AppleLink: EP.SUSSEX                |
  1029. | Sussex University, Falmer | Telephone: +44 1273 678639          |
  1030. | Brighton BN1 9QG, England | Facsimile: +44 1273 678611          |
  1031.  
  1032. +++++++++++++++++++++++++++
  1033.  
  1034. >From jons@ivi.com (Jon Steinmetz)
  1035. Date: Tue, 13 Jun 1995 10:27:16 -0600
  1036. Organization: IVI Publishing, Inc.
  1037.  
  1038. In article <P.T.Russell-1206951653400001@paul.biols.susx.ac.uk>,
  1039. P.T.Russell@sussex.ac.uk (Paul Russell) wrote:
  1040.  
  1041. > If my doubleback procedure takes too long to execute, is there a
  1042. > possiblity that it will get called reentrantly to fill the next buffer,
  1043. > before it has finished filling the current one ? Or does the Sound Manager
  1044. > remember that the previous buffer has not yet been filled and generate an
  1045. > error ?
  1046.  
  1047.   Assuming that you have not marked the buffer as completed I do not think
  1048. that your routine will be called again for that buffer.
  1049.  
  1050. -- 
  1051. // Jon Steinmetz
  1052. // IVI Publishing, Inc.
  1053. //    work:     jons@ivi.com
  1054. //    personal: stein045@gold.tc.umn.edu
  1055. //    web page: http://www.umn.edu/nlhome/g262/stein045/
  1056.  
  1057. +++++++++++++++++++++++++++
  1058.  
  1059. >From P.T.Russell@sussex.ac.uk (Paul Russell)
  1060. Date: Tue, 13 Jun 1995 18:12:48 +0100
  1061. Organization: Experimental Psychology, Sussex University
  1062.  
  1063. In article <jons-1306951027160001@199.199.200.217>, jons@ivi.com (Jon
  1064. Steinmetz) wrote:
  1065.  
  1066. >In article <P.T.Russell-1206951653400001@paul.biols.susx.ac.uk>,
  1067. >P.T.Russell@sussex.ac.uk (Paul Russell) wrote:
  1068. >
  1069. >> If my doubleback procedure takes too long to execute, is there a
  1070. >> possiblity that it will get called reentrantly to fill the next buffer,
  1071. >> before it has finished filling the current one ? Or does the Sound Manager
  1072. >> remember that the previous buffer has not yet been filled and generate an
  1073. >> error ?
  1074. >> 
  1075. >
  1076. >  Assuming that you have not marked the buffer as completed I do not think
  1077. >that your routine will be called again for that buffer.
  1078. >
  1079.  
  1080. Ah, yes, but I have one routine which handles both buffers. I would
  1081. imagine that this is a fairly typical scenario (?). So, if my routine is
  1082. still filling buffer[0] when it becomes time to fill up buffer[1], I'm
  1083. wondering whether the Sound Manager is smart enough not to call my
  1084. doubleback procedure reentrantly, or whether I have to handle this case
  1085. myself ? I guess it might already have given up at this point if buffer[0]
  1086. wasn't flagged as ready ?
  1087.  
  1088. I have actually added some code to my doubleback routine now, so that it
  1089. won't get confused if it's called reentrantly, but it's not an easy thing
  1090. to test...
  1091.  
  1092. //Paul
  1093.  
  1094. -- 
  1095. | Paul Russell              | Internet:  P.T.Russell@sussex.ac.uk |
  1096. | Experimental Psychology   | AppleLink: EP.SUSSEX                |
  1097. | Sussex University, Falmer | Telephone: +44 1273 678639          |
  1098. | Brighton BN1 9QG, England | Facsimile: +44 1273 678611          |
  1099.  
  1100. +++++++++++++++++++++++++++
  1101.  
  1102. >From h+@metrowerks.com (Jon Watte)
  1103. Date: Thu, 15 Jun 1995 10:38:50 -0500
  1104. Organization: <CLASSIFIED>
  1105.  
  1106.  
  1107. In article <P.T.Russell-1306951812480001@paul.biols.susx.ac.uk>,
  1108. P.T.Russell@sussex.ac.uk (Paul Russell) wrote:
  1109.  
  1110. > I have actually added some code to my doubleback routine now, so that it
  1111. > won't get confused if it's called reentrantly, but it's not an easy thing
  1112. > to test...
  1113.  
  1114. Create an OSQueue with only one item. Dequeue the item when entering, and
  1115. enqueue when leaving. This is an atomic (semaphore) operation. If the
  1116. queue's empty when entering, you're being re-entered.
  1117.  
  1118. Cheers,
  1119.  
  1120.                                 / h+
  1121.  
  1122.  
  1123.  
  1124.  
  1125. +++++++++++++++++++++++++++
  1126.  
  1127. >From hawkfish@punchdeck.com (Richard Wesley)
  1128. Date: 19 Jun 1995 21:15:06 GMT
  1129. Organization: Punch Deck Consulting
  1130.  
  1131. In article <AC05BE3A966816D3C@slip11.metrowerks.com>
  1132. h+@metrowerks.com (Jon Watte) writes:
  1133.  
  1134. > Create an OSQueue with only one item. Dequeue the item when entering, and
  1135. > enqueue when leaving. This is an atomic (semaphore) operation. If the
  1136. > queue's empty when entering, you're being re-entered.
  1137.  
  1138. class Semaphore {
  1139.  
  1140. protected:
  1141.  
  1142.     QElem mElem;
  1143.     QHdr  mQueue;
  1144.  
  1145. public:
  1146.  
  1147.     Semaphore (Boolean inState) 
  1148.     {mQueue.qHead = mQueue.qTail = nil; if (!inState) Unlock ();};
  1149.  
  1150.     OSErr Lock (void) {return ::Dequeue (&mElem, &mQueue);};
  1151.     void  Unlock (void) {if (!mQueue.qHead) ::Enqueue (&mElem, &mQueue);};
  1152. };
  1153.  
  1154. - rmgw
  1155.  
  1156. http://www.halcyon.com/hawkfish/Resume.html
  1157.  
  1158. - ----------------------------------------------------------------------------
  1159. Richard Wesley   hawkfish@punchdeck.com | "Oh boy!  Did you forget the plot
  1160. Punch Deck Consulting  pnchdeck@aol.com |  _again_?"
  1161.      Macintosh Software Development     |    - Rocket J. Squirrel
  1162. - ----------------------------------------------------------------------------
  1163.  
  1164. ---------------------------
  1165.  
  1166. >From scouten@metrowerks.com (Eric Scouten)
  1167. Subject: [ANNOUNCE] MacTCP programmer's web page MOVED
  1168. Date: Mon, 19 Jun 1995 18:10:05 -0500
  1169. Organization: metrowerks, inc.
  1170.  
  1171. The MacTCP Programmer's Web page that I've been maintaining for the last
  1172. year or so has been moved and updated. It can now be found at:
  1173.  
  1174.   http://www.metrowerks.com/tcpip/index.html
  1175.  
  1176.  
  1177. Forwarding links will be available at the old site for a short period of
  1178. time. As a favor to the sys admin at that machine, I ask that you please
  1179. update any printed or hypertext links to the old site as soon as possible.
  1180.  
  1181. Thanks and enjoy the new site!
  1182.  
  1183. -es
  1184.  
  1185. __________________________________________________________________________
  1186. Eric Scouten                                       Constructor Constructor
  1187. scouten@metrowerks.com                                     Metrowerks, Inc.
  1188.  
  1189.  
  1190.  
  1191. ---------------------------
  1192.  
  1193. End of C.S.M.P. Digest
  1194. **********************
  1195.